﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<set>
#include<vector>
using namespace std;
void test1() {
	set<int,greater<int>> s; //set容器是Key类型 ，map是Key_Value类型

	//一、插入：
	//1.直接插入x：
	s.insert(6);
	s.insert(8);
	s.insert(4);
	s.insert(7);
	s.insert(9);
	s.insert(2);

	//2.迭代器区间插入：
	vector<int> v{ 9,5,3,4,1,14,12,17 };
	set<int> s2;
	s2.insert(v.begin(), v.end());

	//3.列表（initializer_list)插入：
	set<int> s3;
	s3.insert({ 10,5,3,1,13,12 });

	//二、构造：
	
	//1.迭代器区间构造：
	set<int> s1(v.begin(), v.end());


	//2.列表构造：
	set<int>s4({ 19,12,15,11,20,25 });


	//三、遍历：

	set<int>::iterator it = s.begin();
	//1.迭代器遍历：
	while (it != s.end()) {
		cout << *it << " ";
		// *it = 2; //set内存的是Key,不能修改。
		++it;
	}
	cout << endl;
	//2.范围for遍历：
	for (auto num : s)
	{
		cout << num << " ";
	}
	cout << endl;

	//3.反向遍历： （set支持双向迭代器）
	set<int>::reverse_iterator rit = s.rbegin();
	while (rit != s.rend()) {
		cout << *rit << " ";
		rit++;
	}
	cout << endl;

	//四、删除：
	size_t num=s.erase(2); //删了返回1，没有返回0

	// 删除⼀段迭代器区间的值
	for (auto num : s)
	{
		cout << num << " ";
	}
	cout << endl;

	//五、查找：
	auto iter=s.find(6); //返回该值处的迭代器

	int size = s.count(4);//计数，有返回1，无返回0

	//六：查找一段区间：
	vector<int> v1{ 30,20,25,10,50,40,45,60 };
	set<int> s5(v1.begin(), v1.end());

	set<int>::iterator itlow = s5.lower_bound(30); //返回>=30的那个迭代器

	set<int>::iterator itup = s5.upper_bound(50); //返回>50的那个迭代器区间
	//根据itlow和itup就能拿到[30,50]这一段区间

	s5.erase(itlow, itup); //将[30,50]这段区间删除
	for (auto num : s5)
	{
		cout << num << " ";
	}
	cout << endl;
}

void test2() {
	multiset<int> ms; //multiset和set用法差不多 ，而multiset允许插入相同的元素

	ms.insert({ 6,4,7,9,2,1,8,4,7,9,2 });
	for (auto num : ms)
	{
		cout << num << " ";
	}
	cout << endl;

    //查找：如果该元素有重复，返回的是中序遍历的第一个
	auto it = ms.find(2);

	//删除：删除所有x
	ms.erase(9);
	ms.erase(2);
	for (auto num : ms)
	{
		cout << num << " ";
	}
	cout << endl;

	//计数：返回x的个数
	size_t num = ms.count(4); 
	cout << num << endl;

}
int main() {
	//test1();
	test2();

	return 0;
}